package behavior.ChainOfResponsibility;

import java.math.BigDecimal;
import java.util.function.BiConsumer;

/**
 * Created by LYJ on 2016/10/20.
 * 详细链接：Chain of Responsibility（责任链）http://blog.csdn.net/u013256816/article/details/51058075
 *
 * 当每个角色处理一件事且代码量比较少时lambda方式更好
 * 当每个角色处理一件事需要进行判断，一定要将这个角色的职责写清楚，不然lambda无法进行判断会继续执行，
 * 比如下面这个例子中lambda的deptHandler中>=1000去掉  300的那条执行语句 在传统方法中能正确执行，
 * 在lambda中无法正确执行，它会‘越级操作’
 * 当每个角色处理一件事情且代码量较多时也不推荐使用lambda
 *
 *
 */
public class MainTest {
    public static void main(String... args) {
        //传统方式
        ConsumeHandler project = new ProjectHandler();
        ConsumeHandler dept = new DeptHandler();
        ConsumeHandler general = new GeneralHandler();
        project.setNextHandler(dept);
        dept.setNextHandler(general);
//        project.doHandler("tom", new BigDecimal(2000));
        project.doHandler("tom", new BigDecimal(300));
//        project.doHandler("qq", new BigDecimal(2000));
//        project.doHandler("zzh", new BigDecimal(20000));
//        project.doHandler("qq", new BigDecimal(20000));
        System.out.println("----------------------");

        //lambda方式
        BiConsumer<String,BigDecimal> projectHandler=(String user,BigDecimal free)->{
            if (1000 > free.doubleValue()){
                if("tom".equals(user))
                    System.out.println(user+" 报销不通过");
                else
                    System.out.println(user+" 给予报销 "+free);
                return;
            }
        };
        BiConsumer<String,BigDecimal> deptHandler=(String user,BigDecimal free)->{
            if (5000 > free.doubleValue()&&1000<=free.doubleValue()){
                if("qq".equals(user))
                    System.out.println(user+" 报销不通过");
                else
                    System.out.println(user+" 给予报销 "+free);
                return;
            }
        };
        BiConsumer<String,BigDecimal> generalHandler=(String user,BigDecimal free)->{
            if (5000 <= free.doubleValue()){
                if("zzh".equals(user))
                    System.out.println(user+" 报销不通过");
                else
                    System.out.println(user+" 给予报销 "+free);
                return;
            }
        };

        BiConsumer<String,BigDecimal> chainHandler=projectHandler
                                                    .andThen(deptHandler)
                                                    .andThen(generalHandler);
//        chainHandler.accept("tom", new BigDecimal(2000));
        chainHandler.accept("tom", new BigDecimal(300));
//        chainHandler.accept("qq", new BigDecimal(2000));
//        chainHandler.accept("zzh", new BigDecimal(20000));
//        chainHandler.accept("qq", new BigDecimal(20000));




    }
}
